/**
 * 动态模块加载系统的类型定义
 */

/**
 * 动态模块元数据接口
 */
export interface DynamicModule {
  /** 模块唯一标识符 */
  id: string
  /** 模块名称 */
  name: string
  /** 模块版本 */
  version: string
  /** 模块描述 */
  description: string
  /** 模块分类 */
  category: string
  /** 模块作者 */
  author: string
  /** 模块依赖 */
  dependencies?: string[]
  /** 所需权限 */
  permissions?: string[]
  /** 模块入口文件 */
  entry: string
  /** 静态资源文件 */
  assets?: string[]
  /** 配置架构（JSON Schema） */
  config_schema?: string
  /** API 端点 */
  api_endpoints?: string[]
  /** 前端文件 */
  frontend_files?: string[]
  /** 是否启用 */
  is_active?: boolean
  /** 创建时间 */
  created_at?: string
  /** 更新时间 */
  updated_at?: string
}

/**
 * 模块加载状态
 */
export interface ModuleLoadState {
  /** 模块ID */
  id: string
  /** 加载状态 */
  status: 'loading' | 'loaded' | 'error' | 'unloaded'
  /** 加载的组件 */
  component?: any
  /** 错误信息 */
  error?: string
  /** 加载时间 */
  loadTime?: number
  /** 重试次数 */
  retryCount?: number
  /** 模块实例 */
  instance?: any
}

/**
 * 模块配置
 */
export interface ModuleConfig {
  [key: string]: any
}

/**
 * 模块事件类型
 */
export type ModuleEventType = 
  | 'module:registered'
  | 'module:loading'
  | 'module:loaded'
  | 'module:error'
  | 'module:unloaded'

/**
 * 模块事件处理器
 */
export type ModuleEventHandler = (moduleId: string, ...args: any[]) => void

/**
 * 模块性能指标
 */
export interface ModulePerformanceMetrics {
  /** 模块ID */
  moduleId: string
  /** 加载时间（毫秒） */
  loadTime: number
  /** 加载时间戳 */
  timestamp: number
  /** 文件大小（字节） */
  fileSize?: number
  /** 依赖数量 */
  dependencyCount?: number
  /** 重试次数 */
  retryCount?: number
}

/**
 * 模块错误信息
 */
export interface ModuleErrorInfo {
  /** 模块ID */
  moduleId: string
  /** 错误类型 */
  errorType: string
  /** 错误消息 */
  errorMessage: string
  /** 错误时间戳 */
  timestamp: number
  /** 堆栈跟踪 */
  stack?: string
  /** 重试次数 */
  retryCount?: number
}

/**
 * 模块注册选项
 */
export interface ModuleRegistrationOptions {
  /** 是否自动加载依赖 */
  autoLoadDependencies?: boolean
  /** 是否预加载 */
  preload?: boolean
  /** 加载超时时间（毫秒） */
  timeout?: number
  /** 最大重试次数 */
  maxRetries?: number
}

/**
 * 模块加载选项
 */
export interface ModuleLoadOptions {
  /** 是否强制重新加载 */
  force?: boolean
  /** 加载超时时间（毫秒） */
  timeout?: number
  /** 最大重试次数 */
  maxRetries?: number
  /** 是否加载依赖 */
  loadDependencies?: boolean
  /** 自定义加载器 */
  loader?: (module: DynamicModule) => Promise<any>
}

/**
 * 模块卸载选项
 */
export interface ModuleUnloadOptions {
  /** 是否强制卸载 */
  force?: boolean
  /** 是否清理缓存 */
  clearCache?: boolean
  /** 是否卸载依赖 */
  unloadDependencies?: boolean
}

/**
 * 模块验证结果
 */
export interface ModuleValidationResult {
  /** 是否有效 */
  isValid: boolean
  /** 错误消息 */
  errors: string[]
  /** 警告消息 */
  warnings: string[]
}

/**
 * 模块依赖图
 */
export interface ModuleDependencyGraph {
  /** 节点（模块） */
  nodes: Map<string, DynamicModule>
  /** 边（依赖关系） */
  edges: Map<string, string[]>
  /** 拓扑排序结果 */
  topologicalOrder: string[]
}

/**
 * 模块缓存条目
 */
export interface ModuleCacheEntry {
  /** 模块ID */
  moduleId: string
  /** 缓存的内容 */
  content: any
  /** 缓存时间 */
  cachedAt: number
  /** 过期时间 */
  expiresAt: number
  /** 缓存键 */
  cacheKey: string
}

/**
 * 模块加载器接口
 */
export interface IModuleLoader {
  /** 加载模块 */
  load(module: DynamicModule, options?: ModuleLoadOptions): Promise<any>
  /** 卸载模块 */
  unload(module: DynamicModule, options?: ModuleUnloadOptions): Promise<void>
  /** 验证模块 */
  validate(module: DynamicModule): Promise<ModuleValidationResult>
  /** 获取模块文件 */
  getModuleFiles(moduleId: string): Promise<any>
}

/**
 * 模块存储接口
 */
export interface IModuleStorage {
  /** 保存模块数据 */
  save(key: string, data: any, ttl?: number): Promise<void>
  /** 获取模块数据 */
  get(key: string): Promise<any>
  /** 删除模块数据 */
  delete(key: string): Promise<void>
  /** 清理过期数据 */
  cleanup(): Promise<void>
}

/**
 * 模块事件发射器接口
 */
export interface IModuleEventEmitter {
  /** 注册事件监听器 */
  on(event: ModuleEventType, handler: ModuleEventHandler): void
  /** 移除事件监听器 */
  off(event: ModuleEventType, handler: ModuleEventHandler): void
  /** 发射事件 */
  emit(event: ModuleEventType, moduleId: string, ...args: any[]): void
  /** 移除所有监听器 */
  removeAllListeners(event?: ModuleEventType): void
}
